#include "List.h"
#include <gtest/gtest.h>

using namespace std;

//TEST(ListTest, ListSort) {
//  List<string> lst;
//  lst.push_back("4");
//  lst.push_back("8");
//  lst.push_back("3");
//  lst.push_back("2");
//  lst.push_back("6");
//  List<string> lst2;
//  lst.push_back("1");
//  lst.push_back("7");
//  lst.push_back("9");
//  lst.sort();
//  lst2.sort();
//  lst.merge(lst2);
//  ASSERT_EQ(7, lst.size());
//  ASSERT_EQ(true, lst.is_sort());
//}

TEST(DISABLED_ListTest, ListSortFront) {
  List<int> lst;
  lst.push_back(4);
  lst.push_back(8);
  lst.push_back(3);
  lst.push_back(2);
  lst.push_back(6);
  ASSERT_EQ(5, lst.size())
    << "Size mismatch after push;\n";


  List<int> lst2;
  lst2.push_back(1);
  ASSERT_EQ(1, lst2.size())
    << "Size mismatch after push;\n";

  lst.sort();
  lst2.sort();

  lst.merge(lst2);

  ASSERT_EQ(6, lst.size())
    << "Size mismatch after merge;\n";

  ASSERT_EQ(true, lst.is_sort())
    << "Wrong order after sort\n";
}

TEST(DISABLED_ListTest, ListSortBack) {
  List<int> lst;
  lst.push_back(4);
  lst.push_back(8);
  lst.push_back(3);
  lst.push_back(2);
  lst.push_back(6);

  List<int> lst2;
  lst2.push_back(9);

  lst.sort();
  lst2.sort();

  lst.merge(lst2);

  ASSERT_EQ(6, lst.size());
  ASSERT_EQ(true, lst.is_sort());
}

TEST(DISABLED_ListTest, ListSortMiddle) {
  List<int> lst;
  lst.push_back(4);
  lst.push_back(8);
  lst.push_back(3);
  lst.push_back(2);
  lst.push_back(6);

  List<int> lst2;
  lst2.push_back(5);

  lst.sort();
  lst2.sort();

  lst.merge(lst2);

  ASSERT_EQ(6, lst.size());
  ASSERT_EQ(true, lst.is_sort());
}


TEST(DISABLED_ListTest, ListMerge) {
  List<int> lst;
  lst.push_back(4);
  //lst.push_back(8);
  //lst.push_back(3);
  //lst.push_back(2);
  //lst.push_back(6);
  //lst.push_back(8);

  List<int> lst2;
  //lst2.push_back(-5);



  lst.sort();
  lst2.sort();

  lst.merge(lst2);

  ASSERT_EQ(1, lst.size());
  ASSERT_EQ(true, lst.is_sort());
}


TEST(ListTest, ListSpliceFront) {
  List<int> lst;
  lst.push_back(1);
  lst.push_back(2);
  lst.push_back(3);

  List<int> lst2;
  lst2.push_back(7);
  lst2.push_back(8);
  lst2.push_back(9);

 /* lst.sort();
  lst2.sort();*/

  lst.splice(0, lst2);
  lst.show_list();
  ASSERT_EQ(6, lst.size());

  ASSERT_EQ(7, lst.element(0));
  ASSERT_EQ(8, lst.element(1));
  ASSERT_EQ(9, lst.element(2));
  ASSERT_EQ(1, lst.element(3));
  ASSERT_EQ(2, lst.element(4));
  ASSERT_EQ(3, lst.element(5));
  //ASSERT_EQ(true, lst.is_sort());
}

TEST(DISABLED_ListTest, ListSpliceMiddle) {
  List<int> lst;
  lst.push_back(4);
  lst.push_back(8);
  lst.push_back(3);
  lst.push_back(2);
  lst.push_back(6);


  List<int> lst2;
  lst2.push_back(5);
  lst2.push_back(7);
  lst2.push_back(1);
  lst2.push_back(9);

  /*lst.sort();
  lst2.sort();*/

  lst.splice(2, lst2);
  ASSERT_EQ(9, lst.size());


  ASSERT_EQ(4, lst.element(0));
  ASSERT_EQ(8, lst.element(1));
  ASSERT_EQ(5, lst.element(2));
  ASSERT_EQ(7, lst.element(3));
  ASSERT_EQ(1, lst.element(4));
  ASSERT_EQ(9, lst.element(5));
  ASSERT_EQ(3, lst.element(6));
  ASSERT_EQ(2, lst.element(7));
  ASSERT_EQ(6, lst.element(8));

  //ASSERT_EQ(true, lst.is_sort());
}

TEST(ListTest, ListSpliceHZ) {
  List<int> lst;
  lst.push_back(1);
  lst.push_back(4);
  lst.push_back(7);
  lst.push_back(9);

  List<int> lst2;
  lst2.push_back(8);
  lst2.push_back(3);
  lst2.push_back(2);
  lst2.push_back(6);

  /*lst.sort();
  lst2.sort();*/

  lst.splice(2, lst2);
  lst.show_list();
  ASSERT_EQ(8, lst.size());


  ASSERT_EQ(1, lst.element(0));
  ASSERT_EQ(4, lst.element(1));
  ASSERT_EQ(8, lst.element(2));
  ASSERT_EQ(3, lst.element(3));
  ASSERT_EQ(2, lst.element(4));
  ASSERT_EQ(6, lst.element(5));
  ASSERT_EQ(7, lst.element(6));
  ASSERT_EQ(9, lst.element(7));

  //ASSERT_EQ(true, lst.is_sort());
}

TEST(ListTest, ListSpliceBack) {
  List<int> lst;
  lst.push_back(1);
  lst.push_back(2);
  lst.push_back(3);

  List<int> lst2;
  lst2.push_back(4);
  lst2.push_back(5);
  lst2.push_back(6);

  //lst.sort();
  //lst2.sort();

  lst.splice(3, lst2);

  ASSERT_EQ(6, lst.size());
  ASSERT_EQ(1, lst.element(0));
  ASSERT_EQ(2, lst.element(1));
  ASSERT_EQ(3, lst.element(2));
  ASSERT_EQ(4, lst.element(3));
  ASSERT_EQ(5, lst.element(4));
  ASSERT_EQ(6, lst.element(5));

  //ASSERT_EQ(true, lst.is_sort());
}

TEST(ListTest, ListSpliceOutofrabge) {
  List<int> lst;
  lst.push_back(1);
  lst.push_back(2);
  lst.push_back(3);

  List<int> lst2;
  lst2.push_back(4);
  lst2.push_back(5);
  lst2.push_back(6);

  //lst.sort();
  //lst2.sort();

  lst.splice(100, lst2);

  ASSERT_EQ(3, lst.size());
  ASSERT_EQ(1, lst.element(0));
  ASSERT_EQ(2, lst.element(1));
  ASSERT_EQ(3, lst.element(2));
  //ASSERT_EQ(4, lst.element(3));
  //ASSERT_EQ(5, lst.element(4));
  //ASSERT_EQ(6, lst.element(5));

  //ASSERT_EQ(true, lst.is_sort());
}

TEST(ListTest, ListFindByKey) {
  List<int> lst;
  lst.push_back(1);
  lst.push_back(2);
  lst.push_back(3);
  lst.push_back(4);
  lst.push_back(5);
  lst.push_back(6);

  /*List<int> lst2;
  lst2.push_back(4);
  lst2.push_back(5);
  lst2.push_back(6);*/

  //lst.sort();
  //lst2.sort();

  //if (lst.find(4))
  //  cout << "FOUND" << endl;
  //else
  //  cout << "NOT FOUND" << endl;

  ASSERT_EQ(6, lst.size());

  ASSERT_EQ(true, lst.find(4));
}